// 如何使等式成立
var a = {
    n: 1
}
console.log(a == 1 && a == 2 && a == 4)

// -------
var a = {
    n: 1,
    valueOf: function () {
        return this.n++
    }
}



// 迭代器的问题
var [a, b] = { a: 1, b: 2 }
// 使上面等式成立
Object.prototype[Symbol.iterator] = function(){
    return Object.values(this)[Symbol.iterator]()
}


// 如何不改原代码的情况下，改obj（私有）
var o = (function(){
    var obj = {
        a: 1,
        b: 2
    }
    return {
        get: function(k){
            return obj[k]
        }
    }
})()

// -----------
Object.defineProperty(Object.prototype, 'abc', {
    get(){
        return this
    }
})

var obj2 = o.get('abc')
obj2.c=2
obj2.a = "wwww"

// 如何防止
var o = (function(){
    var obj = {
        a: 1,
        b: 2
    }
    return {
        get: function(k){
            // 方式1， 确定是他自己的属性非原型上的
            if(obj.hasOwnProperty(k)){
                return obj[k]
            }
            return undefined
        }
    }
})()
// 方式2：
var o = (function(){
    var obj = {
        a: 1,
        b: 2
    }
    // 方式2 ，对象没有原型
    Object.setPrototypeOf(obj, null)
    return {
        get: function(k){
            return undefined
        }
    }
})()